/**
 * 装饰器
 *  react @connect
 *  nest.js da大量会用到装饰器
 *  类装饰器  装饰类的，用在类声明之前，用来监视修改和替换类的含义
 *
 *  静态属性是属于类的，非静态属性是属于实例的
 *
 *  装饰器的执行顺序
 *  1.有多个装饰器的时候，从最后一个参数依次向前执行
 *  2.类装饰器总是最后执行
 *  3.方法和属性装饰器，谁在前面谁先执行，
 *
 *
 * */

namespace a {
    /**
     * 类装饰器
     * */
    function classDecorator() {
        return function (target: any) {
            console.log('class decorator')
        }
    }


    /**
     * 属性装饰器有两个参数：
     * @param：target ：如果是静态成员，target就是类的构造函数，
     * @param：property：方法或者属性的名称
     *
     * */
    function upperCase(target: any, property: string) {
        let value = target[property];
        const getter = () => value;
        const setter = (newVal: string) => {
            value = newVal.toUpperCase()
        }
        if (delete target[property]) {
            Object.defineProperty(target, property, {
                get: getter,
                set: setter,
                enumerable: true,
                configurable: true
            })
        }
    }

    /**
     * 方法装饰器  三个参数
     * @param：target ：如果是静态成员，target就是类的构造函数，如果是实例成员，
     * @param：property：方法的名称
     * @parram：escriptor 方法的描述器
     *
     * */

    function noEnumable(target: any, property: string, descriptor: PropertyDescriptor) {
        function noEnumable(target: any, property: string, descriptor: PropertyDescriptor) {
            descriptor.enumerable = false;
        }
    }

    @classDecorator()
    class Person {
        @upperCase
        name: string = 'ygg'

        @noEnumable
        getName() {
            console.log(this.name)
        }

    }

    let p = new Person();
    p.name = 'zhufeng';
    console.log('p.name', p.name)


}


